//#ifndef Brain_h__
//#define Brain_h__
//
//namespace GoalAI
//{
//
//#include <vector>
//
//enum STATE
//{
//    ACTIVE,
//    INACTIVE,
//    FAILED,
//    FINISHED
//};
//
//Actor
//{
//
///*
//
//Brain,Think
//
//Brain
//    Goals
//        {
//            SetTargetNode
//        }
//
//*/
//}
//template <class T> class Goal
//{
//public:
//    STATE   GetState() {return m_state;}
//    void    SetState(STATE state){m_state = state;}
//    STATE   vEvaluate()     = 0;
//    void    vOnEnter()      = 0;
//    void    vOnExit()       = 0;
//    STATE   vUpdate()       = 0;
//    int     vGetPri()       = 0;
//
//private:
//    STATE m_state;
//    T* m_owner;
//    Brain* m_brain;
//    std::vector<Goal*> m_goals;
//};
//
//template <class T> struct Goal_Compare
//{
//    bool operator() (const Goal<T>& lhs,const Goal<T>& rhs )
//    {
//        return lhs.vGetPri() < rhs.vGetPri();
//    }
//};
//
//template <class T> class Brain
//{
//public:
//    Brain(T* owner) :m_owner(owner) {}
//    void AddGoal(Goal<T>* goal)
//    {
//        m_goals.push_back(goal);
//    }
//    void ReEvaluate()
//    {
//        /* For each Goal, evaluate, get the highest priority */
//    }
//    void Think()
//    {
//        if(m_currentGoals.size() > 0)
//        {
//            GoalSet::iterator it = m_currentGoals.begin();
//            bool failed = false;
//            while(it != m_currentGoals.end())
//            {
//                if(failed)
//                    break;
//
//                switch(it->vEvaluate())
//                {
//                case GoalAI::ACTIVE : 
//                    {
//                        it->vUpdate();
//                        ++it;
//                        break;
//                    }
//                case GoalAI::FINISHED : 
//                    {
//                        it->vOnExit();
//                        it->SetState(GoalAI::INACTIVE);
//                        it = m_currentGoals.erase(it);
//                        break;
//                    }
//                case GoalAI::FAILED : 
//                    {
//                        failed = true;
//                        break;
//                    }
//                }
//            }
//        }
//        /*EvaluteTopNode
//            {
//                Foreach node in static tree
//                GetPriority
//
//                Add highest pro to top of current Goals    
//            }
//
//            //Now we are here, 
//            for each goal in set
//                execute;
//            
//        */
//    }
//
//private:
//    T* m_owner;
//    typedef std::set<Goal*,Goal_Compare> GoalSet;
//    GoalSet m_currentGoals;
//    std::vector<Goal<T>*> m_goals;
//};
//
//}; //GoalAI
//
//#endif // Brain_h__
